/**
 * Copyright 2017 TerraMeta Software, Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.cloudgraph.hbase.service;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.cloudgraph.store.mapping.StoreMappingProp;

public class QueryThreadPool {
  private static volatile QueryThreadPool instance;
  private ThreadPoolExecutor executorService;
  private int minThreadPoolSize;
  private int maxThreadPoolSize;

  private QueryThreadPool() {
    this.minThreadPoolSize = StoreMappingProp.getQueryPoolMin();
    this.maxThreadPoolSize = StoreMappingProp.getQueryPoolMax();
    this.executorService = new ThreadPoolExecutor(this.minThreadPoolSize, this.maxThreadPoolSize,
        0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
        new ThreadPoolExecutor.CallerRunsPolicy());
  }

  public static QueryThreadPool instance() {
    if (instance == null)
      initInstance();
    return instance;
  }

  private static synchronized void initInstance() {
    if (instance == null)
      instance = new QueryThreadPool();
  }

  public ThreadPoolExecutor getExecutor() {
    return executorService;
  }

  public int getMinThreadPoolSize() {
    return minThreadPoolSize;
  }

  public int getMaxThreadPoolSize() {
    return maxThreadPoolSize;
  }

}
